package penerimabeasiswa;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *Class  PenerimaBeasiswa adalah kelas yang mendiskripsikan seberapa layak
 * Mahasiswa tersebut menerima beasiswa
 * @author fendi
 */
public class PenerimaBeasiswa {
    private double besarGajiOrtu,besarIPK;
    private double alfa[];
    private double Z[];
    /**
     * Constructor untuk inisialisasi besar gaji orangtua dan ipk
     * @param gajiOrtu
     * @param IPK
     */
    public PenerimaBeasiswa(double gajiOrtu, double IPK) {
        this.besarGajiOrtu = gajiOrtu;
        this.besarIPK = IPK;
    }
    /**
     * mengembalikan nilai minimum
     * @param x
     * @param y
     * @return nilai minimum
     */
    private double findMin(double x, double y){
        if (x<y){
            return x;
        }else{
            return y;
        }
    }
/**
 * Procedure ini digunakan untk menentukan nilai alfa dan Z
 */
    private void apply_rule(){
        alfa=new double [12];
        Z=new double [12];
        GajiOrtu gajiOrtu=new GajiOrtu(besarGajiOrtu);
        IPK ipk=new IPK(besarIPK);
        Kelayakan kelayakan=new Kelayakan();
        //if gaji kecil and ipk buruk then kelayakan rendah
        alfa[0]=findMin(gajiOrtu.keanggotaanKecil(),ipk.keanggotaanBuruk());
        kelayakan.setAlfa(alfa[0]);
        Z[0]=kelayakan.getKelayakanRendah();
        //if gaji sedang and ipk buruk then kelayakan rendah
        alfa[1]=findMin(gajiOrtu.keanggotaanSedang(),ipk.keanggotaanBuruk());
        kelayakan.setAlfa(alfa[1]);
        Z[1]=kelayakan.getKelayakanRendah();
        //if gaji besar and ipk buruk then kelayakan rendah
        alfa[2]=findMin(gajiOrtu.keanggotaanBesar(),ipk.keanggotaanBuruk());
        kelayakan.setAlfa(alfa[2]);
        Z[2]=kelayakan.getKelayakanRendah();
        //if gaji sangat besar and ipk buruk then kelayakan rendah
        alfa[3]=findMin(gajiOrtu.keanggotaanSangatBesar(),ipk.keanggotaanBuruk());
        kelayakan.setAlfa(alfa[3]);
        Z[3]=kelayakan.getKelayakanRendah();
        //if gaji kecil and ipk cukup then kelayakan tinggi
        alfa[4]=findMin(gajiOrtu.keanggotaanKecil(),ipk.keanggotaanCukup());
        kelayakan.setAlfa(alfa[4]);
        Z[4]=kelayakan.getKelayakanTinggi();
        //if gaji sedang and ipk cukup then kelayakan rendah
       alfa[5]=findMin(gajiOrtu.keanggotaanSedang(),ipk.keanggotaanCukup());
        kelayakan.setAlfa(alfa[5]);
        Z[5]=kelayakan.getKelayakanRendah();
        //if gaji besar and ipk cukup then kelayakan rendah
        alfa[6]=findMin(gajiOrtu.keanggotaanBesar(),ipk.keanggotaanCukup());
        kelayakan.setAlfa(alfa[6]);
        Z[6]=kelayakan.getKelayakanRendah();
        //if gaji Sangat Besar and ipk cukup then kelayakan rendah
        alfa[7]=findMin(gajiOrtu.keanggotaanSangatBesar(),ipk.keanggotaanCukup());
        kelayakan.setAlfa(alfa[7]);
        Z[7]=kelayakan.getKelayakanRendah();
        //if gaji kecil and ipk bagus then kelayakan tinggi
        alfa[8]=findMin(gajiOrtu.keanggotaanKecil(),ipk.keanggotaanBagus());
        kelayakan.setAlfa(alfa[8]);
        Z[8]=kelayakan.getKelayakanTinggi();
        //if gaji sedang and ipk bagus then kelayakan tinggi
        alfa[9]=findMin(gajiOrtu.keanggotaanSedang(),ipk.keanggotaanBagus());
        kelayakan.setAlfa(alfa[9]);
        Z[9]=kelayakan.getKelayakanTinggi();
        //if gaji besar and ipk bagus then kelayakan tinggi
        alfa[10]=findMin(gajiOrtu.keanggotaanBesar(),ipk.keanggotaanBagus());
        kelayakan.setAlfa(alfa[10]);
        Z[10]=kelayakan.getKelayakanTinggi();
        //if gaji sangat besar and ipk bagus then kelayakan rendah
        alfa[11]=findMin(gajiOrtu.keanggotaanSangatBesar(),ipk.keanggotaanBagus());
        kelayakan.setAlfa(alfa[11]);
        Z[11]=kelayakan.getKelayakanRendah();
    }
    /**
     * methode untuk menghitung nilai kelayakan mahasiswa untuk menerima beasiswa
     * @return indeks kelayakan penerima mahasiswa.
     */
    public double getKelayakanMenerimaBeasiswa(){
        apply_rule();
        return defuzzy();
    }
/**
 * method untuk defuzy 
 * @return nilai kelayakan untuk menerima beasiswa
 */
    private double defuzzy(){
        double temp1=0,temp2=0;
        for (int i=0;i<12;i++){
            temp1=temp1+alfa[i]*Z[i];
            temp2=temp2+alfa[i];
        }
        return (temp1/temp2);
    }
}
